OpenFisca Editor検証: Gemini Pro1.5 (全ソースコード使用)
検証に使用したスクリプト(こちらで使用したプロンプトを自動作成できます。最新版は merge_source_withdata.sh)
まとめ
既存のOpenFiscaのコードをすべてsystem instructionに追加することで精度向上
OpenFiscaらしいコードを出力できた
コードをクラス丸ごと「丸暗記」しているような挙動
既存制度に似ているものがある場合は、それを名前だけ変更して返す
(生成した特別障害者手当 は、既存の 重度心身障害者手当 の計算とほぼ同じ式)
既存実装をコピペしてくるため、その回答に「レビュー」をし修正していくのが有効
特別障害者手当の検証では、3回のレビューで実用に耐えるコードにまで修正できた
トークンが多いため、今回の手法はGemini以外では採用できない可能性がある(Geminiは指定可能トークン数が多く、100万トークンまで処理可能)
3000語、13万文字
検証内容
code:_
あなたはOpenFiscaに新たな制度を追加しようとしているプログラマーです。過去実装されているすべての制度に精通しており、その関係性にもとづき注意深く新制度の処理を追加することができます。以下は過去実装された制度のソースコードです。
// 以下今まで実装した全ての制度のソースコード...
例:受験生チャレンジ支援貸付
code:md
制度情報をもとにソースコードを生成してください。
制度情報: 「児童育成手当」
`
児童育成手当のwebサイトのHTML
`
ソースコード:
`
# (児童育成手当のソースコード)
# ...
`
制度情報 「受験生チャレンジ支援貸付」
`
受験生チャレンジ支援貸付のwebサイトのHTML
`
ソースコード:
生成結果
同一の制度が実装済みの場合
受験生チャレンジ支援貸付:全く同一のソースコードを生成
→クラス丸ごと記憶していると考えられる
未実装の場合
特別障害者手当:類似の 重度心身障害者手当 とほぼ同じソースコードを生成
ただし、variableの名前は正しく置換できている
code:py
"""
特別障害者手当の実装
"""
import numpy as np
from openfisca_core.periods import DAY
from openfisca_core.variables import Variable
from openfisca_japan.entities import 世帯, 人物
from openfisca_japan.variables.障害.愛の手帳 import 愛の手帳等級パターン
from openfisca_japan.variables.障害.身体障害者手帳 import 身体障害者手帳等級パターン
class 特別障害者手当_最大(Variable):
value_type = float
entity = 世帯
definition_period = DAY
label = "特別障害者手当の最大額"
documentation = """
厳密な判定には詳細な症状が必要なため、愛の手帳等級、身体障害者手帳等から推定可能な最小値、最大値を算出
算出方法は以下リンクも参考になる。
"""
def formula(対象世帯, 対象期間, parameters):
年齢 = 対象世帯.members("年齢", 対象期間)
年齢条件 = 年齢 >= 20
愛の手帳等級 = 対象世帯.members("愛の手帳等級", 対象期間)
身体障害者手帳等級 = 対象世帯.members("身体障害者手帳等級", 対象期間)
# 該当する可能性のある条件
一号要件 = (愛の手帳等級 == 愛の手帳等級パターン.一度) | (愛の手帳等級 == 愛の手帳等級パターン.二度)
二号要件 = ((愛の手帳等級 == 愛の手帳等級パターン.一度) | (愛の手帳等級 == 愛の手帳等級パターン.二度)) * \
((身体障害者手帳等級 == 身体障害者手帳等級パターン.一級) | (身体障害者手帳等級 == 身体障害者手帳等級パターン.二級))
三号要件 = 身体障害者手帳等級 == 身体障害者手帳等級パターン.一級
障害条件 = 一号要件 | 二号要件 | 三号要件
所得条件 = 対象世帯.members("特別障害者手当所得制限", 対象期間)
人物ごとの受給条件 = 年齢条件 * 障害条件 * 所得条件
対象人数 = 対象世帯.sum(人物ごとの受給条件)
return 対象人数 * parameters(対象期間).福祉.育児.特別障害者手当.特別障害者手当額
class 特別障害者手当_最小(Variable):
value_type = float
entity = 世帯
definition_period = DAY
label = "特別障害者手当の最小額"
documentation = """
厳密な判定には詳細な症状が必要なため、愛の手帳等級、身体障害者手帳等から推定可能な最小値、最大値を算出
算出方法は以下リンクも参考になる。
"""
def formula(対象世帯, 対象期間, parameters):
年齢 = 対象世帯.members("年齢", 対象期間)
年齢条件 = 年齢 >= 20
愛の手帳等級 = 対象世帯.members("愛の手帳等級", 対象期間)
身体障害者手帳等級 = 対象世帯.members("身体障害者手帳等級", 対象期間)
# 1号要件,3号要件は愛の手帳、身体障害者手帳のみでは該当しない可能性があるため最小額は0
二号要件 = ((愛の手帳等級 == 愛の手帳等級パターン.一度) | (愛の手帳等級 == 愛の手帳等級パターン.二度)) * \
((身体障害者手帳等級 == 身体障害者手帳等級パターン.一級) | (身体障害者手帳等級 == 身体障害者手帳等級パターン.二級))
障害条件 = 二号要件
所得条件 = 対象世帯.members("特別障害者手当所得制限", 対象期間)
人物ごとの受給条件 = 年齢条件 * 障害条件 * 所得条件
対象人数 = 対象世帯.sum(人物ごとの受給条件)
return 対象人数 * parameters(対象期間).福祉.育児.特別障害者手当.特別障害者手当額
class 特別障害者手当所得制限(Variable):
value_type = bool
entity = 人物
definition_period = DAY
label = "特別障害者手当の所得制限"
def formula(対象人物, 対象期間, parameters):
特別障害者手当 = parameters(対象期間).福祉.育児.特別障害者手当
扶養人数 = 対象人物.世帯("扶養人数", 対象期間)0 # 複数世帯入力(2以上の長さのndarray入力)対応のためndarray化
所得 = 対象人物("所得", 対象期間)
# 便宜上、世帯の最大の所得を扶養義務者の所得とする
扶養義務者の所得 = 対象人物.世帯("世帯高所得", 対象期間)
年齢 = 対象人物("年齢", 対象期間)
# 20歳未満の場合扶養義務者、20歳以上の場合本人の所得を参照
本人所得を参照 = 年齢 >= 20
対象となる所得 = np.where(本人所得を参照, 所得, 扶養義務者の所得)
給与所得及び雑所得からの控除額 = parameters(対象期間).所得.給与所得及び雑所得からの控除額
社会保険料控除 = np.where(np.logical_not(本人所得を参照), parameters(対象期間).所得.社会保険料相当額, 0)
# 上限33万円
配偶者特別控除 = np.clip(対象人物("配偶者特別控除", 対象期間), 0, 330000)
障害者控除 = 対象人物("障害者控除", 対象期間)
# 障害者控除, 特別障害者控除については、本人所得の場合本人の分は適用しない
障害者控除対象 = 対象人物("障害者控除対象", 対象期間)
特別障害者控除対象 = 対象人物("特別障害者控除対象", 対象期間)
本人の控除 = np.select(
0)
障害者控除 = 障害者控除 - 本人所得を参照 * 本人の控除
# TODO: 同居特別障害者の場合も通常の特別障害者と同じ額に補正する必要がある?
寡婦控除 = 対象人物("寡婦控除", 対象期間)
ひとり親控除 = 対象人物("ひとり親控除", 対象期間)
勤労学生控除 = 対象人物("勤労学生控除", 対象期間)
# 他の控除(雑損控除・医療費控除等)は定額でなく実費を元に算出するため除外する
控除総額 = 給与所得及び雑所得からの控除額 + 社会保険料控除 + 配偶者特別控除 + 障害者控除 + 寡婦控除 + ひとり親控除 + 勤労学生控除
控除後所得 = 対象となる所得 - 控除総額
return 控除後所得 <= 所得制限限度額
レビューを行い修正すると、OpenFiscaの書き方で修正できた
code:md
以下条件を満たすように「特別障害者手当」のコードを修正してください。
`
上記、限度額に加算されるもの
○受給資格者の所得
・扶養親族等に、同一生計配偶者のうち70歳以上の者又は老人扶養親族があるときは、1人につき100,000円
・扶養親族等に、特定扶養親族又は控除対象扶養親族(19歳未満の者に限る。)があるときは、1人につき250,000円
○配偶者・扶養義務者の所得(扶養親族等の数が2人以上の場合)
・扶養親族等に老人扶養親族があるときは、1人につき(当該老人扶養親族のほかに扶養親族等がないときは、当該老人扶養親族のうち1人を除いた老人扶養親族1人につき)60,000円
`
code:python
# ...
class 特別障害者手当所得制限(Variable):
value_type = bool
entity = 人物
definition_period = DAY
label = "特別障害者手当の所得制限"
def formula(対象人物, 対象期間, parameters):
特別障害者手当 = parameters(対象期間).福祉.育児.特別障害者手当
扶養人数 = 対象人物.世帯("扶養人数", 対象期間)0 # 複数世帯入力(2以上の長さのndarray入力)対応のためndarray化
# 加算処理
所得制限限度額 += 対象人物.世帯("特別障害者手当_受給者の所得加算額", 対象期間)
# 扶養親族が2人以上の場合のみ加算
if 扶養人数 >= 2:
所得制限限度額 += 対象人物.世帯("特別障害者手当_扶養義務者の所得加算額", 対象期間)
# ... (以下同様)
return 控除後所得 <= 所得制限限度額
class 特別障害者手当_受給者の所得加算額(Variable):
value_type = float
entity = 世帯
definition_period = DAY
label = "特別障害者手当_受給者の所得加算額"
def formula(対象世帯, 対象期間, parameters):
年齢 = 対象世帯.members("年齢", 対象期間)
# 同一生計配偶者のうち70歳以上の者
配偶者である = 対象世帯.has_role(世帯.親)
配偶者の年齢 = 配偶者である * 年齢
配偶者が70歳以上 = 配偶者の年齢 >= 70
配偶者70歳以上の人数 = 対象世帯.sum(配偶者が70歳以上)
# 老人扶養親族
老人扶養親族である = 対象世帯.members("扶養親族である", 対象期間) & (年齢 >= 70)
老人扶養親族の人数 = 対象世帯.sum(老人扶養親族である)
# 特定扶養親族又は控除対象扶養親族(19歳未満の者に限る。)
子供である = 対象世帯.has_role(世帯.子)
特定扶養親族又は控除対象扶養親族である = 対象世帯.members("扶養親族である", 対象期間) & 子供である & (年齢 < 19)
特定扶養親族又は控除対象扶養親族の人数 = 対象世帯.sum(特定扶養親族又は控除対象扶養親族である)
return (
(配偶者70歳以上の人数 + 老人扶養親族の人数) * parameters(対象期間).福祉.育児.特別障害者手当.所得制限限度額_加算額.老人扶養親族等
+ 特定扶養親族又は控除対象扶養親族の人数 * parameters(対象期間).福祉.育児.特別障害者手当.所得制限限度額_加算額.特定扶養親族等
)
class 特別障害者手当_扶養義務者の所得加算額(Variable):
value_type = float
entity = 世帯
definition_period = DAY
label = "特別障害者手当_扶養義務者の所得加算額"
def formula(対象世帯, 対象期間, parameters):
年齢 = 対象世帯.members("年齢", 対象期間)
# 老人扶養親族
老人扶養親族である = 対象世帯.members("扶養親族である", 対象期間) & (年齢 >= 70)
老人扶養親族の人数 = 対象世帯.sum(老人扶養親族である)
# 老人扶養親族以外の人数
子供である = 対象世帯.has_role(世帯.子)
老人扶養親族以外の人数 = 対象世帯.sum(対象世帯.members("扶養親族である", 対象期間) & (np.logical_not(老人扶養親族である)) & 子供である & (年齢 < 19))
# 老人扶養親族の人数が2人以上の場合、1人を除いた人数を加算
加算人数 = np.where(老人扶養親族の人数 >= 2, 老人扶養親族の人数 - 1, 0)
return 加算人数 * parameters(対象期間).福祉.育児.特別障害者手当.所得制限限度額_加算額.老人扶養親族
さらに修正
code:_
以下レビューに従って 特別障害者手当_扶養義務者の所得加算額 を修正してください。
- 加算人数 の計算が誤りです。以下のように修正してください。
- 扶養親族等の数が2人以上の場合
- 扶養親族が老人扶養親族のみの場合、加算人数は 老人扶養親族の人数 - 1
- それ以外の場合、加算人数は 老人扶養親族の人数
code:python
class 特別障害者手当_扶養義務者の所得加算額(Variable):
value_type = float
entity = 世帯
definition_period = DAY
label = "特別障害者手当_扶養義務者の所得加算額"
def formula(対象世帯, 対象期間, parameters):
年齢 = 対象世帯.members("年齢", 対象期間)
# 老人扶養親族
老人扶養親族である = 対象世帯.members("扶養親族である", 対象期間) & (年齢 >= 70)
老人扶養親族の人数 = 対象世帯.sum(老人扶養親族である)
# 老人扶養親族以外の人数
子供である = 対象世帯.has_role(世帯.子)
老人扶養親族以外の人数 = 対象世帯.sum(対象世帯.members("扶養親族である", 対象期間) & (np.logical_not(老人扶養親族である)) & 子供である & (年齢 < 19))
# 老人扶養親族のみの場合、1人を除いた人数を加算
# それ以外の場合、老人扶養親族の人数を加算
加算人数 = np.where(老人扶養親族以外の人数 == 0, 老人扶養親族の人数 - 1, 老人扶養親族の人数)
return 加算人数 * parameters(対象期間).福祉.育児.特別障害者手当.所得制限限度額_加算額.老人扶養親族
まだ誤解している箇所があるため修正
何度かやり取りしているからか、差分が無い部分はコメントで省略してくれた
code:_
加算人数の np.where の判定に用いる条件は 老人扶養親族以外の人数 == 0 ではなく、老人扶養親族以外の扶養親族の人数 です。
code:python
class 特別障害者手当_扶養義務者の所得加算額(Variable):
# ... (他の部分は変更なし)
def formula(対象世帯, 対象期間, parameters):
# ... (他の部分は変更なし)
# 老人扶養親族以外の人数
子供である = 対象世帯.has_role(世帯.子)
老人扶養親族以外の扶養親族の人数 = 対象世帯.sum(対象世帯.members("扶養親族である", 対象期間) & (np.logical_not(老人扶養親族である)))
# 老人扶養親族のみの場合、1人を除いた人数を加算
# それ以外の場合、老人扶養親族の人数を加算
加算人数 = np.where(老人扶養親族以外の扶養親族の人数 == 0, 老人扶養親族の人数 - 1, 老人扶養親族の人数)
# ... (他の部分は変更なし)
あとは既存実装に合わせて少し手直しするだけでそのまま使えるところまで生成できた
類似実装がない制度を自動生成
パラメータファイルについてもSystem Instructionに追加
System Instruction
code:_
あなたはOpenFiscaに新たな制度を追加しようとしているプログラマーです。過去実装されているすべての制度に精通しており、その関係性にもとづき注意深く新制度の処理を追加することができます。以下は過去実装された制度のソースコードです。
// (以下今まで実装した全ての制度のソースコード...)
データ一覧
// (以下今まで実装した全てのparameter(yamlファイル), asset, (csvファイル))
Prompt
code:md
制度情報をもとにソースコードを生成してください。
制度情報: 「児童育成手当」
`
児童育成手当のwebサイトのHTML
`
ソースコード:
`
# (児童育成手当のソースコード)
# ...
`
`
# (児童育成手当のパラメータファイル)
# ...
`
制度情報 「障害基礎年金」
`
障害基礎年金のwebサイトのHTML
`
ソースコード:
結果:パラメータファイルも一緒に生成された
どれがどの数値であるか取り違えないようにする工夫は必要そう
複雑な部分はTODOにしてくれた
code:python
class 障害基礎年金(Variable):
value_type = int
entity = 人物
definition_period = DAY
label = "障害基礎年金"
def formula(対象人物, 対象期間, parameters):
# 20歳以上65歳未満であること
年齢 = 対象人物("年齢", 対象期間)
年齢条件 = (年齢 >= 20) * (年齢 < 65)
# 初診日の要件
障害認定日 = 対象人物("障害認定日", 対象期間)
初診日 = 対象人物("初診日", 対象期間)
初診日が障害認定日以前である = 初診日 < 障害認定日
# 国民年金加入期間または20歳前または日本国内に住んでいる60歳以上65歳未満で年金制度に加入していない期間に初診日があること
国民年金加入期間 = 対象人物("国民年金加入期間", 対象期間)
初診日が国民年金加入期間にある = parameters.between(初診日, 国民年金加入期間.start, 国民年金加入期間.end)
初診日が20歳前である = 初診日 < 対象人物("20歳の誕生日", 対象期間)
初診日が60歳以上65歳未満である = (初診日 >= 対象人物("60歳の誕生日", 対象期間)) * (初診日 < 対象人物("65歳の誕生日", 対象期間))
初診日の条件 = 初診日が障害認定日以前である * (初診日が国民年金加入期間にある | 初診日が20歳前である | 初診日が60歳以上65歳未満である)
# 障害等級の要件
障害等級 = 対象人物("障害等級", 対象期間)
障害等級条件 = (障害等級 == 1) | (障害等級 == 2)
# 納付要件
# 初診日の前日に、初診日がある月の前々月までの被保険者期間で、国民年金の保険料納付済期間(厚生年金保険の被保険者期間、共済組合の組合員期間を含む)と保険料免除期間をあわせた期間が3分の2以上あること。
# ただし、初診日が令和8年4月1日前にあるときは、初診日において65歳未満であれば、初診日の前日において、初診日がある月の前々月までの直近1年間に保険料の未納がなければよいことになっています。
# また、20歳前の年金制度に加入していない期間に初診日がある場合は、納付要件は不要です。
納付要件 = True # TODO: 未実装
# 年金額
子の加算額 = 対象人物("障害基礎年金の子の加算額", 対象期間)
# 複数世帯入力(2以上の長さのndarray入力)対応のためndarray化
[parameters(対象期間).障害基礎年金.年金額.一級 + 子の加算額,
parameters(対象期間).障害基礎年金.年金額.二級 + 子の加算額], 0)
return 年齢条件 * 初診日の条件 * 障害等級条件 * 納付要件 * 年金額
class 障害等級(Variable):
value_type = int
entity = 人物
definition_period = DAY
label = "障害等級"
class 初診日(Variable):
value_type = date
entity = 人物
definition_period = DAY
label = "初診日"
class 障害認定日(Variable):
value_type = date
entity = 人物
definition_period = DAY
label = "障害認定日"
class 障害基礎年金の子の加算額(Variable):
value_type = int
entity = 人物
definition_period = DAY
label = "障害基礎年金の子の加算額"
def formula(対象人物, 対象期間, parameters):
対象児童人数 = 対象人物.世帯("障害基礎年金の対象児童人数", 対象期間)
# 複数世帯入力(2以上の長さのndarray入力)対応のためndarray化
[parameters(対象期間).障害基礎年金.年金額.子の加算額 * 対象児童人数,
parameters(対象期間).障害基礎年金.年金額.子の加算額 * 2 + parameters(対象期間).障害基礎年金.年金額.子の加算額_三人目以降 * (対象児童人数 - 2)], 0)
class 障害基礎年金の対象児童人数(Variable):
value_type = int
entity = 世帯
definition_period = DAY
label = "障害基礎年金の対象児童人数"
def formula(対象世帯, 対象期間, _parameters):
子供である = 対象世帯.has_role(世帯.子)
年齢 = 対象世帯.members("年齢", 対象期間)
18歳3ヶ月未満の児童 = 子供である * (年齢 < 18.25)
20歳未満で障害等級1級または2級の状態にある子 = 子供である * (年齢 < 20) * ((対象世帯.members("障害等級", 対象期間) == 1) | (対象世帯.members("障害等級", 対象期間) == 2))
return 対象世帯.sum(18歳3ヶ月未満の児童 + 20歳未満で障害等級1級または2級の状態にある子)
code:yaml
description: 障害基礎年金の年金額
metadata:
unit: currency-JPY
values:
2024-04-01:
value: 816000
code:yaml
description: 障害基礎年金の年金額
metadata:
unit: currency-JPY
values:
2024-04-01:
value: 1020000
code:yaml
description: 障害基礎年金の年金額(子の加算額)
metadata:
unit: currency-JPY
values:
2024-04-01:
value: 234800
code:yaml
description: 障害基礎年金の年金額(子の加算額:三人目以降)
metadata:
unit: currency-JPY
values:
2024-04-01:
value: 78300
修正
code:md
以下のレビューに従ってコードを修正してください。
- 変数名の算用数字を漢数字に置き換えてください。
- 「障害基礎年金の子の加算額」のentidyは「世帯」です。
code:_
ソースコードの修正
以下の点について修正しました。
変数名の算用数字を漢数字に置き換えました。
「障害基礎年金の子の加算額」のentityを「世帯」に変更しました。
code:py
class 障害基礎年金(Variable):
value_type = int
entity = 人物
definition_period = DAY
label = "障害基礎年金"
def formula(対象人物, 対象期間, parameters):
# 二十歳以上六十五歳未満であること
年齢 = 対象人物("年齢", 対象期間)
年齢条件 = (年齢 >= 20) * (年齢 < 65)
# 初診日の要件
障害認定日 = 対象人物("障害認定日", 対象期間)
初診日 = 対象人物("初診日", 対象期間)
初診日が障害認定日以前である = 初診日 < 障害認定日
# 国民年金加入期間または二十歳前または日本国内に住んでいる六十歳以上六十五歳未満で年金制度に加入していない期間に初診日があること
国民年金加入期間 = 対象人物("国民年金加入期間", 対象期間)
初診日が国民年金加入期間にある = parameters.between(初診日, 国民年金加入期間.start, 国民年金加入期間.end)
初診日が二十歳前である = 初診日 < 対象人物("二十歳の誕生日", 対象期間)
初診日が六十歳以上六十五歳未満である = (初診日 >= 対象人物("六十歳の誕生日", 対象期間)) * (初診日 < 対象人物("六十五歳の誕生日", 対象期間))
初診日の条件 = 初診日が障害認定日以前である * (初診日が国民年金加入期間にある | 初診日が二十歳前である | 初診日が六十歳以上六十五歳未満である)
# 障害等級の要件
障害等級 = 対象人物("障害等級", 対象期間)
障害等級条件 = (障害等級 == 1) | (障害等級 == 2)
# 納付要件
# 初診日の前日に、初診日がある月の前々月までの被保険者期間で、国民年金の保険料納付済期間(厚生年金保険の被保険者期間、共済組合の組合員期間を含む)と保険料免除期間をあわせた期間が三分の二以上あること。
# ただし、初診日が令和8年4月1日前にあるときは、初診日において65歳未満であれば、初診日の前日において、初診日がある月の前々月までの直近1年間に保険料の未納がなければよいことになっています。
# また、二十歳前の年金制度に加入していない期間に初診日がある場合は、納付要件は不要です。
納付要件 = True # TODO: 未実装
# 年金額
子の加算額 = 対象人物.世帯("障害基礎年金の子の加算額", 対象期間)
# 複数世帯入力(2以上の長さのndarray入力)対応のためndarray化
[parameters(対象期間).障害基礎年金.年金額.一級 + 子の加算額,
parameters(対象期間).障害基礎年金.年金額.二級 + 子の加算額], 0)
return 年齢条件 * 初診日の条件 * 障害等級条件 * 納付要件 * 年金額
class 障害等級(Variable):
value_type = int
entity = 人物
definition_period = DAY
label = "障害等級"
class 初診日(Variable):
value_type = date
entity = 人物
definition_period = DAY
label = "初診日"
class 障害認定日(Variable):
value_type = date
entity = 人物
definition_period = DAY
label = "障害認定日"
class 障害基礎年金の子の加算額(Variable):
value_type = int
entity = 世帯 # 修正箇所
definition_period = DAY
label = "障害基礎年金の子の加算額"
def formula(対象世帯, 対象期間, parameters):
対象児童人数 = 対象世帯("障害基礎年金の対象児童人数", 対象期間)
# 複数世帯入力(2以上の長さのndarray入力)対応のためndarray化
[parameters(対象期間).障害基礎年金.年金額.子の加算額 * 対象児童人数,
parameters(対象期間).障害基礎年金.年金額.子の加算額 * 2 + parameters(対象期間).障害基礎年金.年金額.子の加算額_三人目以降 * (対象児童人数 - 2)], 0)
class 障害基礎年金の対象児童人数(Variable):
value_type = int
entity = 世帯
definition_period = DAY
label = "障害基礎年金の対象児童人数"
def formula(対象世帯, 対象期間, _parameters):
子供である = 対象世帯.has_role(世帯.子)
年齢 = 対象世帯.members("年齢", 対象期間)
十八歳三ヶ月未満の児童 = 子供である * (年齢 < 18.25)
二十歳未満で障害等級1級または2級の状態にある子 = 子供である * (年齢 < 20) * ((対象世帯.members("障害等級", 対象期間) == 1) | (対象世帯.members("障害等級", 対象期間) == 2))
return 対象世帯.sum(十八歳三ヶ月未満の児童 + 二十歳未満で障害等級1級または2級の状態にある子)
System InstructionsにHTMLを指定
上記に加え、全ソースコードに対応するwebページソースコードも追加
pythonソースコード、webページをファイルごとに交互に配置することで対応付けを表現
結果:精度が下がった
HTMLの情報が大半を占め、ソースコードの特徴を掴むのに失敗した?
リンク切れやpdf(テキストに起こせないためスキップしている)等によって、Variableとwebサイトの個数が一対一対応していないのも原因かも
数回やりなおしたが、下記のような短い計算式しか生成されなかった
code:python
class 児童育成手当(Variable):
value_type = float
entity = 世帯
definition_period = DAY
label = "保護者への児童手当"
documentation = """
渋谷区の児童育成手当制度
- 〒150-8010 東京都渋谷区宇田川町1-1
- 渋谷区子ども青少年課子育て給付係
- 03-3463-2558
"""
def formula(対象世帯, 対象期間, parameters):
居住都道府県 = 対象世帯("居住都道府県", 対象期間)
居住地条件 = 居住都道府県 == "東京都"
児童育成手当 = parameters(対象期間).福祉.育児.児童育成手当
# 世帯で最も高い所得の人が基準となる。特別児童扶養手当と同等の控除が適用される。
世帯高所得 = 対象世帯("特別児童扶養手当の控除後世帯高所得", 対象期間)
扶養人数 = 対象世帯("扶養人数", 対象期間)
# NOTE: 直接 所得制限限度額[扶養人数] のように要素参照すると型が合わず複数世帯の場合に計算できないためnp.selectを使用
所得制限限度額 = np.select(
[児童育成手当.所得制限限度額i for i in range(6)], -1).astype(int)
所得条件 = 世帯高所得 < 所得制限限度額
ひとり親世帯である = 対象世帯("ひとり親", 対象期間)
学年 = 対象世帯.members("学年", 対象期間)
上限学年以下の人数 = 対象世帯.sum(学年 <= 児童育成手当.上限学年)
手当条件 = ひとり親世帯である * 所得条件 * 居住地条件
return 手当条件 * 上限学年以下の人数 * 児童育成手当.金額